#include "APP_Com.h"

//获取当前毫秒数
long long APP_COM_Get_CurrtMs(void)
{
    struct timeval tv;
    //获取当前的时间戳
    gettimeofday(&tv,NULL);
    //将当前的秒数和微秒数转化为 毫秒数
    return (long long)(tv.tv_sec * 1000) + (tv.tv_usec / 1000);
}


//字符本质上就是一个整形0-255的数字

//十六进制字符 转 字符(int)   
int hexStr_to_int(char hex,int* num)
{
    if('0' <= hex && hex <= '9')
    {
        *num = hex - '0';
    }
    else if('a' <= hex && hex <= 'z')
    {
        *num = hex - 'a' + 10;
    }
    else if('A' <= hex && hex <= 'Z')
    {
        *num = hex - 'A' + 10;
    }
    else
    {
        log_error("当前字符%c为非法字符,不属于十六进制范围\n",hex);
        return -1;
    }
    return 0;
}

//十六进制数字字符数组 转 字符(int)数组  形如"61" -> 'a'(97) 
int APP_COM_HexStr_To_Bytes(char* hexstr,char* bytes,int hex_len)
{
    int i;
    for(i = 0;i < (hex_len / 2);i++)
    {
        //十六进制数 高位
        int hig = 0;
        int ret = hexStr_to_int(hexstr[i*2],&hig);
        if(ret != 0)
        {
            log_info("十六进制数字符 转 字符转化异常\n");
            return -1;
        }

        //十六进制数 低位
        int low = 0;
        ret = hexStr_to_int(hexstr[i*2 + 1],&low);
        if(ret != 0)
        {
            log_info("十六进制数字符 转 字符转化异常\n");
            return -1;
        }
        //合并高低位
        bytes[i] = (hig << 4) | low;
    }
    bytes[i] = '\0';
    return 0;
}

//字符(int)数组 转 十六进制数字字符数组 'a' -> "61" ('a'>>4  'a' & 0x0F )
int APP_COM_Bytes_To_HexStr(char* hexstr,char* bytes,int byte_len)
{
    int i;
    char* ch = "0123456789ABCDEF";
    for(i = 0;i < byte_len;i++)
    {
        hexstr[i*2] = ch[(bytes[i] >> 4) & 0x0F];
        hexstr[i*2 + 1] = ch[bytes[i] & 0x0F];
        if(i == (byte_len - 1))
        {
            hexstr[(i + 1)* 2] = '\0';
        }
    }
    return 0;
}

void hexstr_print(char* hexstr,int len)
{
    for(int i = 0;i < len;i++)
    {
        printf("%02X ",(unsigned char)hexstr[i]);
    }
    printf("\n");
}
